﻿#include "chinese.h"

/*! ************************************************************
 * \file
 * \brief 提供一个日志封装，统一所有应用的日志文件路径和格式
 * \authors 林胜勇
 * \date
 * \verbatim
 * 变更记录：
 * 2023-11-30，林胜勇:
 *   创建文件
 * \endverbatim
 ****************************************************************/

#pragma once

#include "log/log.h"

#define APP_LOG_FILE_PATH "/var/xmover/log/{0}/{0}_log.txt"
#define APP_CUSTOM_DAILY_LOG_FILE_PATH "/var/xmover/log/{0}/%Y-%m-%d_{0}_log.txt"
#define APP_CUSTOM_HOURLY_LOG_FILE_PATH "/var/xmover/log/{0}/%Y-%m-%d_%H_{0}_log.txt"
#define APP_LOG_FILE_MAX_SIZE 3 * 1024 * 1024
#define APP_LOG_MAX_FILES LOG_DEFAULT_MAX_FILES
#define APP_LOG_HOURLY_MAX_FILES 48
#define APP_LOG_PATTERN LOG_DEFAULT_PATTERN

/*!
 * \example
 * \brief 日志的使用例子
 * \code
   示例如下：
   #include <log/app_log.h>
   int main(){
    // 在main函数中初始化日志，日志文件存在/var/xmover/log/.../
    cppc::log::initAppHourlyLog("monitor");

    // 添加日志，日志函数有：trace、debug、info、warn、error、fatal
    cppc::log::info("info log:{},{}", 1, "2");
    cppc::log::debug("debug log:{},{},{}", 1.23, "2", 3);

    // 在main函数return前关闭日志
    closeAppLog();
    return 0;
  }
* \endcode
*/
namespace cppc {
namespace log {
/// 初始化应用日志，按大小进行循环滚动
/// \param appName 应用程序名称，用于创建日志所在文件夹
/// \param level 日志级别，只记录小于等于此级别的日志，
///                         [ LOG_FATAL, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_TRACE, LOG_ALL ]
/// \param logMaxFileSize 单个日志文件最大字节数，超出将创建新的日志文件
/// \param logMaxFiles 最多几个日志文件
/// \param logFilePath 日志存放路径，如果为空则默认使用APP_LOG_FILE_PATH
extern bool initAppRollingFileLog(const std::string &appName, log::LogLevel level = LOG_DEBUG,
                                  int logMaxFileSize = APP_LOG_FILE_MAX_SIZE, int logMaxFiles = APP_LOG_MAX_FILES,
                                  const std::string &logFilePath = "", const std::string &logPattern = APP_LOG_PATTERN);

/// 初始化应用日志，按日期进行循环滚动
/// \param appName 应用程序名称，用于创建日志所在文件夹
/// \param level 日志级别，只记录小于等于此级别的日志，
///                         [ LOG_FATAL, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_TRACE, LOG_ALL ]
/// \param logMaxFiles 最多几个日志文件
/// \param customFormatFilename 是否启用对%Y-%m-%d格式的logFilePath的支持，比如将日期格式化到文件名的最前面。
///                  true：可在logFilePath中任意位置使用%Y-%m-%d
///                  false：将日期追加到文件名末尾
/// \param logFilePath 日志存放路径，如果为空则默认使用APP_LOG_FILE_PATH
extern bool initAppDailyFileLog(const std::string &appName, log::LogLevel level = LOG_DEBUG,
                                int logMaxFiles = APP_LOG_MAX_FILES, bool customFormatFilename = true, const std::string &logFilePath = "", const std::string &logPattern = APP_LOG_PATTERN);

/// 初始化应用日志，按小时进行循环滚动
/// \param appName 应用程序名称，用于创建日志所在文件夹
/// \param level 日志级别，只记录小于等于此级别的日志，
///                         [ LOG_FATAL, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_TRACE, LOG_ALL ]
/// \param hourInterval 时间文件的时间间隔，单位小时，最小1
/// \param logMaxFiles 最多几个日志文件
/// \param customFormatFilename 是否启用对%Y-%m-%d格式的logFilePath的支持，比如将日期格式化到文件名的最前面。
///                  true：可在logFilePath中任意位置使用%Y-%m-%d
///                  false：将日期追加到文件名末尾
/// \param logFilePath 日志存放路径，如果为空则默认使用APP_LOG_FILE_PATH
extern bool initAppHourlyFileLog(const std::string &appName, log::LogLevel level = LOG_DEBUG, int hourInterval = 1,
                                 int logMaxFiles = APP_LOG_HOURLY_MAX_FILES, bool customFormatFilename = true, const std::string &logFilePath = "",
                                 const std::string &logPattern = APP_LOG_PATTERN);

/// 关闭程序日志，不需要手动调用
extern void closeAppLog();
}
} // namespace cppc::log
